package cn.kennylee.codehub.mq.lip.integration.base;

import org.springframework.lang.NonNull;

import java.time.Duration;
import java.util.concurrent.CompletableFuture;

/**
 * <p> 消息频道，生产者 </p>
 * <p>Created on 2025/4/18.</p>
 *
 * @param <T> 消息发送结果回调
 * @author kennylee
 * @since 0.0.1
 */
public interface MqChannel<T> {

    String TRACE_ID_KEY = "traceId";

    /**
     * 同步发送消息
     *
     * @param channel   主分类标识 核心业务分类（如：order, payment），对应 RocketMQ 的 Topic 或 Kafka 的主 Topic
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容，payload
     * @return 消息发送结果
     */
    T sendMsg(@NonNull String channel, @NonNull String routeKey, @NonNull MessageVo messageVo);

    /**
     * 同步发送消息
     *
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @return 消息发送结果
     */
    T sendMsg(@NonNull String routeKey, @NonNull MessageVo messageVo);

    /**
     * 同步发送延迟消息
     *
     * @param channel   主分类标识 核心业务分类（如：order, payment），对应 RocketMQ 的 Topic 或 Kafka 的主 Topic
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @param delayTime 延迟时间
     * @return 消息发送结果
     */
    default T sendMsg(@NonNull String channel, @NonNull String routeKey, @NonNull MessageVo messageVo, Duration delayTime) {
        throw new UnsupportedOperationException("unsupported yet!");
    }

    /**
     * 同步发送延迟消息
     *
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @param delayTime 延迟时间
     * @return 消息发送结果
     */
    T sendMsg(@NonNull String routeKey, @NonNull MessageVo messageVo, Duration delayTime);

    /**
     * 事务提交后，发送消息
     *
     * @param channel   主分类标识 核心业务分类（如：order, payment），对应 RocketMQ 的 Topic 或 Kafka 的主 Topic
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @return CompletableFuture
     */
    CompletableFuture<T> sendMsgByAfterTx(@NonNull String channel, @NonNull String routeKey, @NonNull MessageVo messageVo);

    /**
     * 事务提交后，发送消息
     *
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @return CompletableFuture
     */
    CompletableFuture<T> sendMsgByAfterTx(@NonNull String routeKey, @NonNull MessageVo messageVo);

    /**
     * 事务提交后，发送延迟消息
     *
     * @param channel   主分类标识 核心业务分类（如：order, payment），对应 RocketMQ 的 Topic 或 Kafka 的主 Topic
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @param delayTime 延迟时间
     * @return CompletableFuture
     */
    CompletableFuture<T> sendMsgByAfterTx(@NonNull String channel, @NonNull String routeKey, @NonNull MessageVo messageVo, Duration delayTime);

    /**
     * 事务提交后，发送延迟消息
     *
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @param delayTime 延迟时间
     * @return CompletableFuture
     */
    CompletableFuture<T> sendMsgByAfterTx(@NonNull String routeKey, @NonNull MessageVo messageVo, Duration delayTime);

    /**
     * 立即异步发送消息
     *
     * @param channel   主分类标识 核心业务分类（如：order, payment），对应 RocketMQ 的 Topic 或 Kafka 的主 Topic
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @return CompletableFuture
     */
    CompletableFuture<T> asyncSendMsg(@NonNull String channel, @NonNull String routeKey, @NonNull MessageVo messageVo);

    /**
     * 立即异步发送消息
     *
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @return CompletableFuture
     */
    CompletableFuture<T> asyncSendMsg(@NonNull String routeKey, @NonNull MessageVo messageVo);

    /**
     * 立即异步延迟发送消息
     *
     * @param channel   主分类标识 核心业务分类（如：order, payment），对应 RocketMQ 的 Topic 或 Kafka 的主 Topic
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @param delayTime 延迟时间
     * @return CompletableFuture
     */
    CompletableFuture<T> asyncSendMsg(@NonNull String channel, @NonNull String routeKey, @NonNull MessageVo messageVo, Duration delayTime);

    /**
     * 立即异步延迟发送消息
     *
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @param delayTime 延迟时间
     * @return CompletableFuture
     */
    CompletableFuture<T> asyncSendMsg(@NonNull String routeKey, @NonNull MessageVo messageVo, Duration delayTime);

    /**
     * 事务提交后，异步发送消息
     *
     * @param channel   主分类标识 核心业务分类（如：order, payment），对应 RocketMQ 的 Topic 或 Kafka 的主 Topic
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @return CompletableFuture
     */
    CompletableFuture<T> asyncSendMsgAfterTx(@NonNull String channel, @NonNull String routeKey, @NonNull MessageVo messageVo);

    /**
     * 事务提交后，异步发送消息
     *
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @return CompletableFuture
     */
    CompletableFuture<T> asyncSendMsgAfterTx(@NonNull String routeKey, @NonNull MessageVo messageVo);

    /**
     * 事务提交后，异步延迟发送消息
     *
     * @param channel   主分类标识 核心业务分类（如：order, payment），对应 RocketMQ 的 Topic 或 Kafka 的主 Topic
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @param delayTime 延迟时间
     * @return CompletableFuture
     */
    CompletableFuture<T> asyncSendMsgAfterTx(@NonNull String channel, @NonNull String routeKey, @NonNull MessageVo messageVo, Duration delayTime);

    /**
     * 事务提交后，异步延迟发送消息
     *
     * @param routeKey  二级路由标识（RocketMQ-Tag / RabbitMQ-RoutingKey / Kafka-SubTopic）
     * @param messageVo 消息内容
     * @param delayTime 延迟时间
     * @return CompletableFuture
     */
    CompletableFuture<T> asyncSendMsgAfterTx(@NonNull String routeKey, @NonNull MessageVo messageVo, Duration delayTime);

}
